package com.smart.community.property.controller;

import java.util.List;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.smart.community.commons.annotation.ApiLog;
import com.smart.community.commons.enums.ApiLogOperationType;
import com.smart.community.commons.result.Result;
import com.smart.community.commons.utils.SecurityUtils;
import com.smart.community.property.service.IPropertyCompanyCommunityService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 物业公司社区关联管理控制器
 * 
 * 功能说明：
 * 1. 提供物业公司与社区关联的CRUD操作
 * 2. 支持社区分配和移除功能
 * 3. 支持关联统计查询
 * 
 * 权限控制：
 * - 根据"智慧社区微服务架构总览.md"文档，Controller层不进行权限检查
 * - 权限检查由Service层处理，确保数据权限正确过滤
 * - 超级管理员可以管理所有关联，普通用户只能管理关联的物业公司
 * 
 * @author Wu.Liang
 * @since 2025-01-29
 */
@Slf4j
@Tag(name = "物业公司社区关联管理", description = "物业公司与社区关联管理相关接口")
@RestController
@RequestMapping("/property/company-communities")
@RequiredArgsConstructor
@Validated
public class PropertyCompanyCommunityController {

    private final IPropertyCompanyCommunityService propertyCompanyCommunityService;

    @Operation(summary = "查询物业公司关联的社区", description = "查询指定物业公司关联的社区列表，超级管理员可查询所有物业公司")
    @GetMapping("/property-company/{propertyCompanyId}")
    @ApiLog(
        logTitle = "查询物业公司关联的社区",
        logType = 2,
        moduleName = "物业管理",
        operationType = ApiLogOperationType.QUERY
    )
    public Result<List<com.smart.community.commons.entity.property.PropertyCompanyCommunity>> getPropertyCompanyCommunities(
            @Parameter(description = "物业公司ID") @PathVariable @NotNull Long propertyCompanyId) throws Exception {
        Long userId = SecurityUtils.getCurrentUserId();
        
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("查询物业公司关联的社区，用户ID：{}，物业公司ID：{}", userId, propertyCompanyId);
        List<com.smart.community.commons.entity.property.PropertyCompanyCommunity> communities = 
                propertyCompanyCommunityService.getPropertyCompanyCommunities(propertyCompanyId);
        
        log.info("查询物业公司关联的社区成功，物业公司ID：{}，社区数量：{}", propertyCompanyId, communities.size());
        return Result.success("查询成功", communities);
    }

    @Operation(summary = "查询可分配的社区", description = "查询可以分配给指定物业公司的社区列表，超级管理员可查询所有社区")
    @GetMapping("/{propertyCompanyId}/available-communities")
    @ApiLog(
        logTitle = "查询可分配的社区",
        logType = 2,
        moduleName = "物业管理",
        operationType = ApiLogOperationType.QUERY
    )
    public Result<List<Object>> getAvailableCommunities(
            @Parameter(description = "物业公司ID") @PathVariable @NotNull Long propertyCompanyId,
            @Parameter(description = "搜索关键词") @RequestParam(required = false) String searchKeyword) throws Exception {
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("查询可分配的社区，物业公司ID：{}，搜索关键词：{}", propertyCompanyId, searchKeyword);
        List<Object> communities = propertyCompanyCommunityService.getAvailableCommunities(propertyCompanyId, searchKeyword);
        
        log.info("查询可分配的社区成功，物业公司ID：{}，可分配社区数量：{}", propertyCompanyId, communities.size());
        return Result.success(communities);
    }

    @Operation(summary = "获取物业公司社区关联统计", description = "获取指定物业公司的社区关联统计信息，超级管理员可查询所有物业公司")
    @GetMapping("/{propertyCompanyId}/stats")
    @ApiLog(
        logTitle = "获取物业公司社区关联统计",
        logType = 2,
        moduleName = "物业管理",
        operationType = ApiLogOperationType.QUERY
    )
    public Result<Object> getPropertyCompanyCommunityStats(
            @Parameter(description = "物业公司ID") @PathVariable @NotNull Long propertyCompanyId) throws Exception {
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("获取物业公司社区关联统计，物业公司ID：{}", propertyCompanyId);
        Object stats = propertyCompanyCommunityService.getPropertyCompanyCommunityStats(propertyCompanyId);
        
        log.info("获取物业公司社区关联统计成功，物业公司ID：{}", propertyCompanyId);
        return Result.success("查询成功", stats);
    }

	@ApiLog(logTitle = "分配社区给物业公司", logType = 2, // 操作日志
			moduleName = "物业管理", operationType = ApiLogOperationType.UPDATE)
    @Operation(summary = "分配社区给物业公司", description = "为指定物业公司分配社区")
    @PostMapping("/{propertyCompanyId}/communities")
    public Result<String> assignCommunitiesToPropertyCompany(
            @Parameter(description = "物业公司ID") @PathVariable @NotNull Long propertyCompanyId,
            @Parameter(description = "社区ID列表") @Valid @RequestBody List<Long> communityIds) throws Exception {
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("为物业公司分配社区，物业公司ID：{}，社区ID列表：{}", propertyCompanyId, communityIds);
        return propertyCompanyCommunityService.assignCommunitiesToPropertyCompany(propertyCompanyId, communityIds);
    }

	@ApiLog(logTitle = "批量移除物业公司与社区的关联", logType = 2, // 操作日志
			moduleName = "物业管理", operationType = ApiLogOperationType.DELETE)
    @Operation(summary = "批量移除物业公司与社区的关联", description = "批量移除物业公司与指定社区的关联关系")
    @DeleteMapping("/{propertyCompanyId}/communities")
    public Result<String> batchRemovePropertyCompanyCommunities(
            @Parameter(description = "物业公司ID") @PathVariable @NotNull Long propertyCompanyId,
            @Parameter(description = "社区ID列表") @Valid @RequestBody List<Long> communityIds) throws Exception {
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("批量移除物业公司与社区的关联，物业公司ID：{}，社区ID列表：{}", propertyCompanyId, communityIds);
        return propertyCompanyCommunityService.batchRemovePropertyCompanyCommunities(propertyCompanyId, communityIds);
    }

	@ApiLog(logTitle = "移除物业公司与社区的关联", logType = 2, // 操作日志
			moduleName = "物业管理", operationType = ApiLogOperationType.DELETE)
    @Operation(summary = "移除物业公司与社区的关联", description = "移除指定的物业公司与社区关联关系")
    @DeleteMapping("/remove/{id}")
    public Result<String> removePropertyCompanyCommunity(
            @Parameter(description = "关联记录ID") @PathVariable @NotNull Long id) throws Exception {
        // 不在这里进行权限检查，让Service层处理权限和数据过滤
        log.info("移除物业公司与社区的关联，关联记录ID：{}", id);
        return propertyCompanyCommunityService.removePropertyCompanyCommunity(id);
    }
} 